package model

// Menu 菜单模型
// @Description 系统菜单信息，包含菜单路径、组件和子菜单
type Menu struct {
	Model
	// 菜单对应的页面名称
	Name string `json:"name" form:"name" gorm:"size:150;comment:菜单对应的页面名称" binding:"required" example:"Dashboard"`
	// 菜单对应的页面请求路径
	Path string `json:"path" form:"path" gorm:"size:255;comment:菜单对应的页面请求路径" example:"/dashboard"`
	// 菜单组件文件在前端项目中的路径
	Component string `json:"component" form:"component" gorm:"size:255;comment:菜单组件文件在前端项目中的路径" example:"views/dashboard/index.vue"`
	// 菜单排序号，决定同级菜单的显示顺序
	Sort int32 `json:"sort" form:"sort" gorm:"default:0;comment:菜单排序号" example:"1"`
	// 菜单状态（0显示 1隐藏）
	Status int8 `json:"status" form:"status" gorm:"default:0;comment:菜单状态(0显示 1隐藏)" example:"0"`
	// 菜单类型（M目录 C菜单 F按钮）
	MenuType string `json:"menuType" form:"menuType" gorm:"size:1;comment:菜单类型(M目录 C菜单 F按钮)" example:"C"`
	// 权限标识
	Permission string `json:"permission" form:"permission" gorm:"size:100;comment:权限标识" example:"system:user:list"`
	// 菜单元数据信息
	MenuMeta MenuMeta `json:"meta" gorm:"foreignKey:MenuId;references:Id;constraint:OnDelete:CASCADE;"`
	// 子菜单列表
	Children []Menu `json:"children" gorm:"-"`
	// 父菜单ID，0表示顶级菜单
	ParentId int `json:"parentId" form:"parentId" gorm:"default:0;comment:父菜单ID" example:"0"`
}

// MenuMeta 菜单元数据模型
// @Description 菜单的元数据信息，包含菜单标题、图标等展示属性
type MenuMeta struct {
	Model
	// 所属菜单ID
	MenuId int `json:"menuId" gorm:"uniqueIndex;comment:所属菜单ID" example:"1"`
	// 菜单显示标题
	Title string `json:"title" form:"title" gorm:"size:50;comment:菜单标题" binding:"required" example:"系统设置"`
	// 菜单图标名称
	Icon string `json:"icon" form:"icon" gorm:"size:50;comment:菜单icon" example:"setting"`
	// 是否缓存页面
	KeepAlive bool `json:"keepAlive" form:"keepAlive" gorm:"default:false;comment:是否缓存页面" example:"true"`
	// 是否隐藏当前菜单
	Hidden bool `json:"hidden" form:"hidden" gorm:"default:false;comment:是否隐藏当前菜单" example:"false"`
	// 路由参数
	Query string `json:"query" form:"query" gorm:"size:255;comment:路由参数" example:"id=1&type=add"`
	// 是否外链
	IsFrame bool `json:"isFrame" form:"isFrame" gorm:"default:false;comment:是否外链" example:"false"`
	// 外链地址
	FrameUrl string `json:"frameUrl" form:"frameUrl" gorm:"size:500;comment:外链地址" example:"https://example.com"`
}

func (Menu) TableName() string {
	return "sys_menu"
}

func (MenuMeta) TableName() string {
	return "sys_menu_meta"
}
